package cn.iocoder.yudao.module.system.job;

import cn.iocoder.yudao.framework.quartz.core.handler.JobHandler;
import cn.iocoder.yudao.module.infra.service.config.ConfigService;
import cn.iocoder.yudao.module.system.controller.admin.otherService.vo.EtlStatusVO;
import cn.iocoder.yudao.module.system.service.otherService.RecordQuery;
import cn.iocoder.yudao.module.system.util.MsgUtil;
import com.alibaba.fastjson.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.List;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

@Component
public class ServiceExceptionMonitorJob implements JobHandler {
    private static final Logger log = LoggerFactory.getLogger(ServiceExceptionMonitorJob.class);
    // 时间格式化器（统一短信时间格式：2025-10-26 08:30:00）
    private static final DateTimeFormatter TIME_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    // 平台名称（可配置到配置中心，此处先固定）
    private static final String PLATFORM_NAME = "湖北省交通运输厅数据共享交换系统开放门户";
    // ETL 正常状态（仅字符串"1"为正常，其他均异常）
    private static final String ETL_NORMAL_STATUS = "1";

    @Resource
    private RecordQuery recordQuery;
    @Resource
    private ConfigService configService;

    @Override
    public String execute(String param) throws Exception {
        // 1. 执行数据库连接测试（true=正常，false/null=异常）
        Boolean driverConn = recordQuery.testDriverInfoConn();
        Boolean vehicleConn = recordQuery.testVehicleInfoConn();
        Boolean shippingNoteConn = recordQuery.testShippingNoteConn();
        Boolean carRepairConn = recordQuery.testCarRepairInfoConn();

        // 2. 查询ETL状态列表（仅etlStatus="1"为正常，其他均异常）
        List<EtlStatusVO> etlStatusList = recordQuery.getEtlStatus();

        // 3. 统计异常数、正常数、总监测项数
        int exceptionCount = 0; // 异常总数
        int normalCount = 0;    // 正常总数
        int totalCount = 0;     // 总监测项数

        // 3.1 统计4个数据库连接项
        totalCount += 4;
        // 司机信息库
        if (Boolean.FALSE.equals(driverConn) || driverConn == null) {
            exceptionCount++;
            log.warn("数据库连接异常：司机信息库连接失败");
        } else {
            normalCount++;
        }
        // 车辆信息库
        if (Boolean.FALSE.equals(vehicleConn) || vehicleConn == null) {
            exceptionCount++;
            log.warn("数据库连接异常：车辆信息库连接失败");
        } else {
            normalCount++;
        }
        // 运单信息库
        if (Boolean.FALSE.equals(shippingNoteConn) || shippingNoteConn == null) {
            exceptionCount++;
            log.warn("数据库连接异常：运单信息库连接失败");
        } else {
            normalCount++;
        }
        // 车辆维修库
        if (Boolean.FALSE.equals(carRepairConn) || carRepairConn == null) {
            exceptionCount++;
            log.warn("数据库连接异常：车辆维修库连接失败");
        } else {
            normalCount++;
        }

        // 3.2 统计ETL状态（核心逻辑：仅etlStatus="1"为正常，其他全是异常）
        if (etlStatusList != null && !etlStatusList.isEmpty()) {
            totalCount += etlStatusList.size();
            for (EtlStatusVO etlStatus : etlStatusList) {
                // 仅当：VO非空 + etlStatus字段非空 + 字段值trim后等于"1" → 才视为正常
                boolean isEtlNormal = etlStatus != null
                        && etlStatus.getEtlStatus() != null
                        && ETL_NORMAL_STATUS.equals(etlStatus.getEtlStatus().trim());

                if (isEtlNormal) {
                    normalCount++; // 只有符合"1"的情况算正常
                } else {
                    exceptionCount++; // 空值、非"1"值全算异常
                    // 打印异常详情，便于排查
                    String etlModule = etlStatus != null ? etlStatus.getEtlName() : "未知模块";
                    String errorStatus = etlStatus != null ? etlStatus.getEtlStatus() : "无状态值";
                    log.warn("ETL状态异常：模块={}，当前状态={}（仅状态为\"1\"时正常）",
                            etlModule, errorStatus);
                }
            }
        }

        // 打印监控结果（校验：总项数=异常数+正常数）
        log.info("服务监控完成：总监测项数={}，异常数={}，正常数={}", totalCount, exceptionCount, normalCount);

        // 4. 异常告警：发送短信
        if (exceptionCount > 0) {
            log.error("服务监控发现异常，需及时处理！异常总数：{}", exceptionCount);

            // 4.1 获取告警手机号（从配置中心读取）
            String contactPhone = configService.getConfigByKey("warning.phone").getValue();
            if (contactPhone == null || contactPhone.trim().isEmpty()) {
                log.error("告警短信发送失败：配置中心「warning.phone」未配置手机号");
                return "服务监控完成，异常总数：" + exceptionCount + "（告警短信发送失败：未配置接收手机号）";
            }

            // 4.2 组装短信模板参数（匹配模板变量）
            JSONObject templateParams = new JSONObject();
            templateParams.put("time", LocalDateTime.now().format(TIME_FORMATTER)); // 监控时间
            templateParams.put("abnormalQuantity", exceptionCount); // 异常数量
            templateParams.put("normalQuantity", normalCount);     // 正常数量
            templateParams.put("platformName", PLATFORM_NAME);     // 平台名称

            // 4.3 调用短信工具类发送短信
            try {
                String smsResponse = MsgUtil.SendMsg(
                        MsgUtil.SIGN_NAME,       // 短信签名
                        contactPhone,            // 接收人手机号
                        "SMS_496830299",         // 短信模板ID
                        templateParams.toString()// 模板参数（JSON字符串）
                );
                log.info("告警短信发送成功！接收人：{}，响应结果：{}", contactPhone, smsResponse);
            } catch (Exception e) {
                log.error("告警短信发送失败！接收人：{}", contactPhone, e);
                return "服务监控完成，异常总数：" + exceptionCount + "（告警短信发送失败：" + e.getMessage() + "）";
            }
        }

        // 返回任务执行结果（定时任务平台可查看）
        return "服务异常监控执行完成：总监测项数=" + totalCount + "，异常数=" + exceptionCount + "，正常数=" + normalCount;
    }
}